/* 导入本地存储方法 */
import { getToken, setToken, removeToken, setTimeOut } from '@/utils/auth'

/* 导入登录API */
import { login, getInfo, getUserDetailById } from '@/api/user'

/* 导入重置路由 */
import { resetRouter } from '@/router/index'

export default {
  namespaced: true,
  state: {
    token: getToken(), /* 获取本地存储的token */
    userInfo: {} /* 存储获取的用户基本信息 */
  },
  mutations: {
    setToken(state, token) {
      state.token = token /* 修改共享数据里的token */
      setToken(token) /* 修改本地存储里的token */
    },
    removeToken(state) {
      state.token = null /* 清空共享数据里的token */
      removeToken() /* 清空本地存储的token */
    },

    /* 存储用户基本信息 */
    setUserInfo(state, result) {
      state.userInfo = result
    },

    /* 删除用户基本信息 */
    removeUserInfo(state) {
      state.userInfo = {}
    }
  },
  actions: {
    /* 调用登录接口 */
    async login(context, data) {
      /* 获取数据 因为拦截器已经解构了数据,所以我们直接接收即可. */
      const result = await login(data)
      /* 存放token */
      context.commit('setToken', result)

      /* 当登录成功后存放完token时,同时存放当前时间戳 */
      setTimeOut()
    },

    /* 获取用户基本信息 */
    async getUserInfo(context) {
      /* 获取用户基本数据 */
      const result = await getInfo()

      const baseInfo = await getUserDetailById(result.userId)
      /* 将用户信息存储到共享数据中 */
      context.commit('setUserInfo', { ...result, ...baseInfo })
      return result /* 为后面权限埋下伏笔 */
    },

    /* 登出功能 */
    logout(context) {
      /* 清空token */
      context.commit('removeToken')
      /* 清空用户信息 */
      context.commit('removeUserInfo')
      /* 重置路由访问权限 */
      resetRouter()
      /* 重置permission子模块里的数据 */
      /*
       此时的context是user的实例,所以我们无法使用context.commit直接调用permission里的函数,因为他不是全局的context
       所以我们要使用究极调用模式root,利用它来调用同级子模块里的函数,其实就是将context变为全局的context
       */
      context.commit('permission/setRoutes', [], { root: true })
      // 重置多页签
      context.dispatch('tagsView/delAllViews', null, { root: true })
    }
  }
}

